home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / shells / scsh-0.4 / scsh-0 / scsh-0.4.2 / main-original.c < prev    next >
C/C++ Source or Header  |  1995-10-13  |  4KB  |  161 lines

  1. /* Copyright (c) 1993, 1994 Richard Kelsey and Jonathan Rees.
  2.    See file COPYING. */
  3.  
  4. #include <stdio.h>
  5.  
  6. #if !defined(DEFAULT_HEAP_SIZE)
  7. /* 1.5 megacell = 6 megabytes (3 meg per semispace) */
  8. #define DEFAULT_HEAP_SIZE 1500000L
  9. #endif
  10.  
  11. #if !defined(DEFAULT_STACK_SIZE)
  12. /* 2500 cells = 10000 bytes */
  13. #define DEFAULT_STACK_SIZE 2500L
  14. #endif
  15.  
  16. #if defined(STATIC_AREAS)
  17. #define DEFAULT_IMAGE_NAME NULL
  18. #else
  19.  
  20. /* DEFAULT_IMAGE_NAME should be defined using the -D switch to cc. */
  21. #if !defined(DEFAULT_IMAGE_NAME)
  22. #define DEFAULT_IMAGE_NAME "s48.image"
  23. #endif
  24.  
  25. #endif /* STATIC_AREAS */
  26.  
  27.  
  28. char *object_file;   /* specified via a command line argument */
  29. char *reloc_file;    /* dynamic loading will set this */
  30.  
  31. main(argc, argv)
  32.      int argc; char **argv;
  33. {
  34.   char *image_name = DEFAULT_IMAGE_NAME;
  35.   long heap_size = DEFAULT_HEAP_SIZE;    /* in numbers of cells */
  36.   long stack_size = DEFAULT_STACK_SIZE;  /* in numbers of cells */
  37.   int errors = 0;
  38.   long return_value;
  39.   extern void sysdep_init();
  40.   extern long required_init_space();
  41.   extern void initialize_vm();
  42.   extern long call_startup_procedure();
  43.   extern long check_image_header();
  44.   extern long read_image();
  45.   extern void register_static_areas();
  46.   void *heap, *stack;
  47.   long required_heap_size, startup_proc;
  48.  
  49. #if defined(STATIC_AREAS)
  50.   extern long entry;
  51.   extern long p_count, *p_areas[], p_sizes[];
  52.   extern long i_count, *i_areas[], i_sizes[];
  53. #endif
  54.  
  55.   long vm_argc = 0;
  56.   char *me = *argv;        /* Save program name. */
  57.  
  58.   object_file = reloc_file = NULL;
  59.  
  60.   argv++; argc--;        /* Skip program name. */
  61.  
  62.   for (; argc > 0; argc--, argv++)
  63.     if (argv[0][0] == '-')
  64.       switch (argv[0][1]) {
  65.       case 'h':
  66.     argc--; argv++;
  67.     if (argc == 0) { errors++; break; }
  68.     heap_size = atoi(*argv);
  69.     if (heap_size <= 0) errors++;
  70.     break;
  71.       case 's':
  72.     argc--; argv++;
  73.     if (argc == 0) { errors++; break; }
  74.     stack_size = atoi(*argv);
  75.     if (stack_size <= 0) errors++;
  76.     break;
  77.       case 'i':
  78.     argc--; argv++;
  79.     if (argc == 0) { errors++; break; }
  80.     image_name = *argv;
  81.     break;
  82.       case 'a':
  83.     argc--;
  84.     vm_argc = argc;    /* remaining args are passed to the VM */
  85.     argc = 0;
  86.     break;
  87.       case 'o':
  88.         argc--; argv++;
  89.     if (argc == 0) { errors++; break; }
  90.         object_file = *argv;
  91.     break;
  92.       default:
  93.     fprintf(stderr, "Invalid argument: %s\n", *argv);
  94.     errors++;
  95.       }
  96.     else
  97.       if (argv[0][0] != '\0') 
  98.     { fprintf(stderr, "Invalid argument: %s\n", *argv);
  99.       errors++; }
  100.   if (errors != 0) {
  101.     fprintf(stderr,
  102. "Usage: %s [options] [-a arguments]\n\
  103. Options: -h <total heap size in words>\n\
  104.      -s <stack buffer size in words>\n\
  105.          -i <image file name>\n\
  106.          -o <object file name>\n",
  107.         me);
  108.     return 1;
  109.   }
  110.  
  111.   sysdep_init();
  112.   scheme48_init();
  113.  
  114.   if (image_name == NULL)
  115.     required_heap_size = 0;
  116.   else {
  117.     /* check_image_header returns number of bytes; required_heap_size
  118.        is number of cells. */
  119.     required_heap_size = check_image_header(image_name) >> 2;
  120.     if (-1 == required_heap_size) {
  121.       fprintf(stderr, "image file %s is unusable\n", image_name);
  122.       return 1; }
  123.   }
  124.  
  125.   required_heap_size += required_init_space(argv, vm_argc);
  126.   
  127.   /* two semi-spaces, plus we want some room to maneuver */
  128.   if (heap_size < 4 * required_heap_size) {
  129.     fprintf(stderr, "heap size %ld is too small, using %ld\n",
  130.         heap_size, 4 * required_heap_size);
  131.     heap_size = 4 * required_heap_size; }
  132.  
  133.   heap = (void *) malloc(heap_size * sizeof(long));
  134.   stack = (void *) malloc(stack_size * sizeof(long));
  135.     
  136.   if (!heap || !stack) {
  137.     fprintf(stderr, "system is out of memory\n");
  138.     return 1; }
  139.  
  140.   initialize_vm(heap, heap_size, stack, stack_size);
  141.  
  142. #if defined(STATIC_AREAS)
  143.   if (image_name == NULL) {
  144.     register_static_areas(p_count, p_areas, p_sizes,
  145.               i_count, i_areas, i_sizes);
  146.     startup_proc = entry;
  147.   } else
  148.     startup_proc = read_image(image_name, 0L);
  149. #else
  150.   startup_proc = read_image(image_name, 0L);
  151. #endif
  152.  
  153.   return_value = call_startup_procedure(startup_proc, argv, vm_argc);
  154.  
  155.   if (reloc_file != NULL)
  156.     if (0 != unlink(reloc_file))
  157.       fprintf(stderr, "unable to delete file %s\n", reloc_file);
  158.  
  159.   return(return_value);
  160. }
  161.